iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
AI/ ML & Data

【AI筆記】30天從論文入門到 Pytorch 實戰系列 第 27

【AI筆記】30天從論文入門到 Pytorch 實戰:使用Llama進行RAG建立 Day 26

  • 分享至 

  • xImage
  •  

這邊使用了最簡單的LlamaIndex建立RAG
本篇可以使用 Colab

安裝套件

!pip install llama-index
!pip install llama-index-llms-gemini llama-index-embeddings-gemini llama-index-embeddings-openai
!pip install GoogleNews

設定 API 和 資料庫儲存位址

這邊要先掛載你的Google Drive

from google.colab import drive
drive.mount('/content/drive', force_remount=True)

在底下路徑開一個資料夾 /drive/MyDrive/ 名稱為 Colab_Llama_storage

或是自己定義 但 PERSIST_DIR 要改成自己的路徑

import os.path
from llama_index.core import (
    Settings,
    VectorStoreIndex,
    SimpleDirectoryReader,
    StorageContext,
    load_index_from_storage,
)
from llama_index.llms.gemini import Gemini
from llama_index.core.llms import ChatMessage
from llama_index.embeddings.gemini import GeminiEmbedding
# from llama_index.embeddings.openai import OpenAIEmbedding

PERSIST_DIR = "/content/drive/MyDrive/Colab_Llama_storage"
GEMINI_API = "<YOUR_GEMINI_API>"
# OPENAI_API = "<YOUR_OPENAI_API>"

建立 RAG

設定Embedding模型和LLM,並準備和 Storage 原始資料,以便進行 RAG。

GeminiEmbedding 可以設定自己想要的 model,之後 embedding 就會用 gemini 去做,LLM 也同時設定好使用Gemini

  • if not os.path.exists(PERSIST_DIR):檢查是否存在持久化目錄。
  • SimpleDirectoryReader("docs").load_data():從docs資料夾中讀取原始資料。
  • VectorStoreIndex.from_documents(documents):從文件中建立向量存儲索引。
  • index.storage_context.persist(persist_dir=PERSIST_DIR):將索引持久化到指定目錄。
  • else:如果持久化目錄已存在,則從存儲中載入索引。

Code: https://blog.jiatool.com/posts/rag_llamaindex_gemini/

資料準備可以自己拿履歷/一些Data丟進該docs資料夾中。

https://ithelp.ithome.com.tw/upload/images/20240825/20168385eDuAuQjQbS.jpg

問問題

question = '他原本讀什麼科系?' # @param {type:"string"}

生成回答

可以使用 Prompt 進行修飾,這樣就不會說得不清楚,也可以讓他簡短回覆。

# Chat
short_response = query_engine.query(question)
messages = [
    ChatMessage(role="user", content=question),
    ChatMessage(role="assistant", content=short_response),
    ChatMessage(role="user", content="請詳細說明"),
]
response = Settings.llm.chat(messages)
# print(short_response)
print(f"assistant 簡短回覆: {short_response} \n\n{response}")

VectorStoreIndex 介紹

在沒有特別指定的情況下,
以下是對VectorStoreIndex的整理:

  1. 默認儲存方法

    • VectorStoreIndex 使用 SimpleVectorStore 作為默認儲存方法。
    • RAG(檔案檢索生成)採用最基礎的方法,沒有使用 Rerank 或 Pre-retrieval。
  2. 索引與查詢

    • 默認設置:chunk size 1024 + overlap 200。
    • 分割文檔:將文檔分割成多個 chunk。
    • 創建節點:對應每個 chunk 創建一個 node。
      • 節點代表來源文件的“chunk”,無論是文字區塊、圖像或更多。
      • 節點包含元資料以及與其他節點和索引結構的關係資訊。
    • 轉換為嵌入:將節點轉換為 embedding,並存回索引 Vector。
      Indexing Mechanism
      Querying mechanism (Source: https://gpt-index.readthedocs.io/en/v0.6.8/guides/primer/index_guide.html)
  3. LlamaIndex

    • 使用簡單的記憶體向量存儲,非常適合快速實驗。
    • 可以透過呼叫 vector_store.persist() 將向量存儲到磁碟,並從磁碟載入 SimpleVectorStore.from_persist_path(...)
  4. 查詢過程

    • 向量存儲索引將每個節點及其相應的嵌入存儲在向量存儲中。
    • 對查詢計算 embedding 後,計算歐式距離,並計算 top K 回傳 node_ids。
    • 獲取前2個最相似的節點,並將這些節點傳遞給 LLM。
    • 合併 chunk 傳給 LLM,內含 metadata(如路徑、時間)

後續也可以使用額外的 prompt 進行調整。

結論

這篇只是做非常簡單的call api,如果要做大型項目,推薦使用比較好管理的資料庫和 Advanced RAG 架構。

如果要部屬的話:

Reference

LlamaIndex使用指南
https://llama-index.readthedocs.io/zh/latest/guides/primer/index_guide.html


上一篇
【AI筆記】30天從論文入門到 Pytorch 實戰:RAG技術的介紹 Day 25
下一篇
【AI筆記】30天從論文入門到 Pytorch 實戰:GraphRAG 論文閱讀 Day 27
系列文
【AI筆記】30天從論文入門到 Pytorch 實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言